package com.ant.backstage.config.redis;

import com.ant.backstage.utils.RedisUtil;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.Serializable;

//企业级session缓存的实现类 EnterpriseCacheSessionDAO
//这个缓存是利用了shiro提供的 Cache 接口 下的 MapCache 实现类实现的，ConcurrentHashMap作为value来保证线程安全！

//自定义sessiondao 代码逻辑值暂时未使用
@Component
public class RedisSessionDAO extends EnterpriseCacheSessionDAO {
    private static Logger logger = LoggerFactory.getLogger(RedisSessionDAO.class);

    private static String prefix = "USER_SHIRO_SESSION:";
    private static int SESSION_TIMEOUT = 1*60*60;

    @Autowired
    RedisUtil redisUtil;

    // 创建session，保存到数据库
    @Override
    protected Serializable doCreate(Session session) {
        Serializable sessionId = super.doCreate(session);
        logger.debug("创建session:{}", session.toString());
//        redisUtil.set(prefix + sessionId.toString(),session,SESSION_TIMEOUT);
        return sessionId;
    }

    // 获取session
    @Override
    protected Session doReadSession(Serializable sessionId) {
        logger.debug("获取session:{}", sessionId);
        // 先从缓存中获取session，如果没有再去数据库中获取
        Session session = super.doReadSession(sessionId);
        if (session == null) {
            session = (Session) redisUtil.get(prefix + sessionId.toString());
        }
        return session;
    }

    // 更新session的最后一次访问时间
    @Override
    protected void doUpdate(Session session) {
        super.doUpdate(session);
        logger.debug("获取session:{}", session.toString());
        String key = prefix + session.getId().toString();
        if (!redisUtil.hasKey(key)) {
            redisUtil.set(key, session);
        }
        boolean expire = redisUtil.expire(key, SESSION_TIMEOUT);
        logger.debug("更新session:{}", session.getId());
    }

    // 删除session
    @Override
    protected void doDelete(Session session) {
        logger.debug("删除session:{}", session.getId());
        super.doDelete(session);
        redisUtil.del(prefix + session.getId().toString());
    }

}

